package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.context.BaseContext;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.CategoryMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class CategoryServicelmpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private SetmealMapper setmealMapper;


//    分类分页查询
    @Override
    public PageResult pageQuery(CategoryPageQueryDTO dto) {
        // 通过使用PageHelper插件，实现分页查询
        PageHelper.startPage(dto.getPage(),dto.getPageSize());
        //  调用mapper的列表查询方法，强转成Pag
        Page<Category> page = categoryMapper.list(dto.getName(),dto.getType());
        //  封装PageResult对象并返回
        return new PageResult(page.getTotal(),page.getResult());
    }

    //  修改分类
    @Override
    public void update(CategoryDTO categoryDTO) {
        //  将dto对象复制到category对象中
        Category category = new Category();
        //  使用BeanUtils工具类，将categoryDTO对象复制到category对象中
        BeanUtils.copyProperties(categoryDTO,category);
        //  设置修改时间、修改人,补全Category里的信息
//        category.setUpdateTime(LocalDateTime.now());
//        category.setUpdateUser(BaseContext.getCurrentId());
        // aop公共字段填充切面类开始自动进行数据填充上面的注释内容,通过反射去补充创建时间和更新时间,操作人等属性值

        //  调用mapper的修改方法
        categoryMapper.update(category);
    }

    //  启用禁用分类
    @Override
    public void startOrStop(Integer status, Long id) {
        //  创建一个Category对象,通过@Builder注解，将前端传递的参数封装到Category对象中,相当于set方法
        Category category = Category.builder()
                .id(id)
                .status(status)
                .build();
//        相当于
//        Category category = new Category();
//        category.setId(id);
//        category.setStatus(status);
//// 需要手动 set 其他字段 或者通过构造函数赋值
        //  设置修改时间、修改人
        category.setUpdateTime(LocalDateTime.now());
        category.setUpdateUser(BaseContext.getCurrentId());
       //  调用mapper的修改方法
        categoryMapper.update(category);

    }

    //  新增菜品分类和套餐分类
    @Override
    public void add(CategoryDTO categoryDTO) {
        Category category = new Category();
        //  属性拷贝
        BeanUtils.copyProperties(categoryDTO,category);
        //  分类状态默认为启用
        category.setStatus(StatusConstant.ENABLE);
        //  设置创建时间、修改时间、创建人、修改人
//        category.setCreateTime(LocalDateTime.now());
//        category.setUpdateTime(LocalDateTime.now());
//        category.setCreateUser(BaseContext.getCurrentId());
//        category.setUpdateUser(BaseContext.getCurrentId());
       // aop公共字段填充切面类开始自动进行数据填充上面的注释内容,通过反射去补充创建时间和更新时间,操作人等属性值

        //  调用mapper的插入方法
        categoryMapper.insert(category);
    }

    //根据id删除分类
    @Override
    public void deleteById(Long id) {
        //需要进行判断,判断判断分类下是否有关联产品,如果有关联产品就提示无法删除
        //查询当前分类是否关联了菜品，如果关联了就抛出业务异常
        int count = dishMapper.countByCategoryId(id);
        if(count > 0){
            //  关联了产品,提示无法删除
            throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);
        }
        //查询当前分类是否关联了套餐，如果关联了就抛出业务异常
        count = setmealMapper.countByCategoryId(id);
        if(count > 0){
            //当前分类下有菜品，不能删除
            throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);
        }
        //判断无误后根据id删除分类数据
        categoryMapper.deleteById(id);
    }
    //根据类型查询分类
    @Override
    public List<Category> list(Integer type) {
        return categoryMapper.listSort(type);
    }
}
